#pragma once
// #include <mysql/plugin_auth_common.h>
#include </usr/include/mysql/plugin_auth_common.h>
#include <string>
#include <cstddef>
#include <odb/nullable.hxx>
#include <odb/core.hxx>

namespace wsll
{
#pragma db object table("user")
    class User
    {
    public:
        User() {}
        // 用户名--新增用户 -- 用户ID, 昵称，密码
        User(const std::string &uid, const std::string &nickname, const std::string &password) : _user_id(uid), _nickname(nickname), _password(password) {}
        // 手机号--新增用户 -- 用户ID, 手机号, 随机昵称（随机昵称就是默认的uid）
        User(const std::string &uid, const std::string &phone) : _user_id(uid), _nickname(uid), _phone(phone) {}

        void user_id(const std::string &val) { _user_id = val; }
        std::string user_id() { return _user_id; } 

        std::string nickname()
        {
            if (_nickname)
                return *_nickname;
            return std::string();
        }
        void nickname(const std::string &val) { _nickname = val; }

        std::string description()
        {
            if (!_description)
                return std::string();
            return *_description;
        }
        void description(const std::string &val) { _description = val; }

        std::string password()
        {
            if (!_password)
                return std::string();
            return *_password;
        }
        void password(const std::string &val) { _password = val; }

        std::string phone()
        {
            if (!_phone)
                return std::string();
            return *_phone;
        }
        void phone(const std::string &val) { _phone = val; }

        std::string avatar_id()
        {
            if (!_avatar_id)
                return std::string();
            return *_avatar_id;
        }
        void avatar_id(const std::string &val) { _avatar_id = val; }

    private:
        friend class odb::access; // 以便于框架对成员进行访问
#pragma db id auto
        unsigned long _id;                  // 我们自己生成的，唯一的用户标识 主键
#pragma db type("varchar(64)") index unique // index的几个字段都表示我们后面可能通过这个字段来查找用户信息
        std::string _user_id;//用户id,类似于微信号?
#pragma db type("varchar(64)") index unique//这里的64是限制了我们这些字段的长度
        odb::nullable<std::string> _nickname;    // 用户昵称-不一定存在（手机号注册用户默认没有昵称）
        odb::nullable<std::string> _description; // 用户签名 - 不一定存在
#pragma db type("varchar(64)")
        odb::nullable<std::string> _password; // 用户密码 - 不一定存在（手机号注册用户默认没有密码）
#pragma db type("varchar(64)") index unique
        odb::nullable<std::string> _phone; // 用户手机号 - 不一定存在
#pragma db type("varchar(64)")
        odb::nullable<std::string> _avatar_id; // 用户头像文件ID - 不一定存在
    };
}

// odb -d mysql --generate-query --generate-schema --profile boost/date-time ../../odb/user.hxx